package com.baosight.sczx.common.zm.cInterface.cp;

import java.math.BigDecimal;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.commons.lang.StringUtils;

import com.baosight.iplat4j.core.ei.EiInfo;
import com.baosight.iplat4j.core.spring.SpringApplicationContext;
import com.baosight.iplat4j.core.threadlocal.UserSession;
import com.baosight.iplat4j.dao.Dao;
import com.baosight.sczx.common.zm.basetools.TablePk;
import com.baosight.sczx.zm.cp.domain.ZMCPProducePlan;

/***
 * 生产计划接口
 * @author wealupa
 * By.严洪浩
 */
public class ProducePlan {
	
	private static Dao dao = (Dao)SpringApplicationContext.getBean("dao");
	
	/**
	 * 判断是否能上报
	 * 如果为空，可以上报，则增加一条主表记录
	 * 如果不为空，可以上报，获得这条记录
	 * @param eiInfo
	 * @return
	 */
	@SuppressWarnings("rawtypes")
	public static String checkCanReport(EiInfo eiInfo) {
		//某年、某月、某矿井
		//生产计划主表是否存在
		String fdPlanYear = eiInfo.getBlock("result").getCellStr(0, "fdPlanYear");
		String fdPlanMonth = eiInfo.getBlock("result").getCellStr(0, "fdPlanMonth");
		String fdMiningId = UserSession.getInSessionProperty("miningCode").toString();
		
		Map<String, String> map = new HashMap<String, String>();
		
		map.put("fdMiningId", fdMiningId);
		map.put("fdPlanYear", fdPlanYear);
		map.put("fdPlanMonth", fdPlanMonth);
		List _result = dao.query("ZMCPProducePlan.query", map);
		
		if(_result == null || _result.isEmpty()) {
			//不存在，就要新增
			ZMCPProducePlan _plan = new ZMCPProducePlan();
			
			String fdKeyId = TablePk.getInstance().getNextValue("T_CP_PRODUCEPLAN");
				
			_plan.setFdKeyId(fdKeyId);
			_plan.setFdTitle(fdPlanYear+"年"+fdPlanMonth+"月的生产计划");
			_plan.setFdMiningId(UserSession.getInSessionProperty("miningCode") == null ? "" : UserSession.getInSessionProperty("miningCode").toString());
			_plan.setFdMiningName(UserSession.getInSessionProperty("miningName") == null ? "" : UserSession.getInSessionProperty("miningName").toString());
			_plan.setFdPlanYear(fdPlanYear);
			_plan.setFdPlanMonth(fdPlanMonth);
			_plan.setFdPlanStatus("草拟");
			_plan.setFdPlanSource(new Long(2));//混合

			dao.insert("ZMCPProducePlan.insert", _plan.toMap());
			return fdKeyId;
		}
		else {
			//如果存在，已经生效 或者 都开始调整，则不能上报
			ZMCPProducePlan _plan = new ZMCPProducePlan();
			boolean cheak = true;
			for (int i = 0; i < _result.size(); i++) {
				_plan = (ZMCPProducePlan)_result.get(i);
				if (_plan.getFdPlanStatus() != null && (_plan.getFdPlanStatus().trim().equals("生效") || _plan.getFdPlanStatus().trim().equals("调整"))) {
					cheak = false;
					break;
				}
			}
			
			if(cheak) {
				_plan = (ZMCPProducePlan)_result.get(0);
				return _plan.getFdKeyId();
			}			
		}
		return null;

	}

	/**
	 * 根据采煤计划明细的变动
	 * 更新专业计划主表的数据
	 * 参数为专业计划keyID
	 */
	@SuppressWarnings("rawtypes")
	public static boolean updateByCM(String fdKeyId, EiInfo inInfo) {

		if(fdKeyId == null || fdKeyId.trim().equals("")) {
			return false;
		}
		
		Map<String, String> _map = new HashMap<String, String>();
		_map.put("fdKeyId", fdKeyId);
		
		List result = dao.query("ZMCPProducePlan.query", _map);
		
		if(result == null || result.isEmpty()) {
			return false;
		}
		else {
			ZMCPProducePlan plan = (ZMCPProducePlan)result.get(0);
			//如果草拟，更新专业计划数据

			if(StringUtils.isNotBlank(plan.getFdPlanStatus()) && plan.getFdPlanStatus().equals("草拟")) {
				Map<String, BigDecimal> _result = ProducePlanCM.CMModify(null, fdKeyId);
				
				BigDecimal bhcmj = _result.get("bhcmj") == null ? new BigDecimal("0") : _result.get("bhcmj");
				BigDecimal zhmcmj = _result.get("zhmcmj") == null ? new BigDecimal("0") : _result.get("zhmcmj");
				BigDecimal hbmjb = new BigDecimal("0");
				if(bhcmj.doubleValue() != 0) {
					hbmjb = BigDecimal.valueOf(zhmcmj.doubleValue() / bhcmj .doubleValue());
				}
				
				//明细计算量
				plan.setFdPlanMine(_result.get("ymSum") == null ? new BigDecimal("0") : _result.get("ymSum"));//原煤产量
				plan.setFdPlanBhcmj(bhcmj);	//保护层面积
				plan.setFdPlanHbmjb(hbmjb);	//厚保面积比
				plan.setFdPlanYmhf(_result.get("hf") == null ? new BigDecimal("0") : _result.get("hf"));//原煤灰分
				plan.setFdPlanHcgx(_result.get("gx") == null ? new BigDecimal("0") : _result.get("gx"));//功效
				
				//专业计划主表数据：掘进煤产量
				if(inInfo != null) {
					//上报时更新
					plan.setFdPlanGrubMine(inInfo.getBlock("result").getCellStr(0, "fdPlanGrubMine") == null ? new BigDecimal("0") : new BigDecimal(inInfo.getBlock("result").getCellStr(0, "fdPlanGrubMine")));
					dao.update("ZMCPProducePlan.updateByCMReport", plan.toMap());//更新生产计划主表数据
				}
				else {
					//修改从表时更新
					dao.update("ZMCPProducePlan.updateByCM", plan.toMap());//更新生产计划主表数据
				}
			}
			//不是草拟，滚蛋 byebye
		}
		
		return true;
	}
	
	/**
	 * 根据掘进计划明细的变动
	 * 更新专业计划主表的数据
	 * 参数为专业计划keyID
	 */
	@SuppressWarnings("rawtypes")
	public static boolean updateByJJ(String fdKeyId, EiInfo inInfo) {

		if(fdKeyId == null || fdKeyId.trim().equals("")) {
			return false;
		}
		
		Map<String, String> _map = new HashMap<String, String>();
		_map.put("fdKeyId", fdKeyId);
		
		List result = dao.query("ZMCPProducePlan.query", _map);
		
		if(result == null || result.isEmpty()) {
			return false;
		}
		else {
			ZMCPProducePlan plan = (ZMCPProducePlan)result.get(0);
			//如果草拟，更新专业计划数据

			if(StringUtils.isNotBlank(plan.getFdPlanStatus()) && plan.getFdPlanStatus().equals("草拟")) {
				Map<String, BigDecimal> _result = ProducePlanJJ.JJModify(null, fdKeyId);
				
				plan.setFdPlanGrub(_result.get("jcSum") == null ? new BigDecimal("0") : _result.get("jcSum"));//掘进总进尺
				
				//专业计划主表数据
				if(inInfo != null) {
					//生产开拓进尺量
					plan.setFdPlanScktjc(inInfo.getBlock("result").getCellStr(0, "fdJcKt") == null ? new BigDecimal("0") : new BigDecimal(inInfo.getBlock("result").getCellStr(0, "fdJcKt")));
					//延伸进尺
					plan.setFdPlanYsjc(inInfo.getBlock("result").getCellStr(0, "fdJcYs") == null ? new BigDecimal("0") : new BigDecimal(inInfo.getBlock("result").getCellStr(0, "fdJcYs")));
					//开拓队进尺
					plan.setFdPlanKtdjc(inInfo.getBlock("result").getCellStr(0, "fdJcKtd") == null ? new BigDecimal("0") : new BigDecimal(inInfo.getBlock("result").getCellStr(0, "fdJcKtd")));
					//生产进尺
					plan.setFdPlanScjc(inInfo.getBlock("result").getCellStr(0, "fdJcSc") == null ? new BigDecimal("0") : new BigDecimal(inInfo.getBlock("result").getCellStr(0, "fdJcSc")));
					//全岩巷
					plan.setFdPlanQyx(inInfo.getBlock("result").getCellStr(0, "fdJcQy") == null ? new BigDecimal("0") : new BigDecimal(inInfo.getBlock("result").getCellStr(0, "fdJcQy")));
					
					dao.update("ZMCPProducePlan.updateByJJReport", plan.toMap());//更新生产计划主表数据
				}
				else {
					//修改从表时更新
					dao.update("ZMCPProducePlan.updateByJJ", plan.toMap());//更新生产计划主表数据
				}
			}
			//不是草拟，滚蛋 byebye
		}
		
		return true;
	}
	
	/**
	 * 判断生产计划是否生效
	 * @param fdKeyId
	 * @return
	 */
	@SuppressWarnings("rawtypes")
	public static boolean validate(String fdKeyId) {
		if(fdKeyId == null)
			return true;
		
		Map<String, String> _map = new HashMap<String, String>();
		_map.put("fdKeyId", fdKeyId);
		_map.put("fdFdPlanStatus", "草拟");
		List result = dao.query("ZMCPProducePlan.query", _map);
		
		if(result == null || result.isEmpty()) {
			//主表都不存在，则不能新增从表
			return false;
		}
		else {
			return true;
		}
	}
}
